package com.hs.wa.redis;

import org.junit.Test;

import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Properties;

/**
 * https://www.cnblogs.com/antLaddie/p/15583991.html
 * JavaMail 版本: 1.6.0
 * JDK 版本: JDK 1.7 以上（必须）
 */
public class JavaMailDemo {

    public static void main(String[] args) throws Exception {
    }

    @Test
    public void sendMail() throws Exception {
        // 1. 创建一封邮件
        Properties props = new Properties();
        //设置邮件的传输协议，常用的协议有SMTP、POP3、IMAP4。这里我们使用qq邮箱发送
        //电子百邮件读取协议度(POP3和IMAP)、简单邮件传输协议（SMTP).我们选择stmp协议
        props.setProperty("mail.transport.protocol", "smtp");
        //设置发件人的邮箱的stmp服务地址(qq邮箱的服务地址)
        props.setProperty("mail.smtp.host", "smtp.qq.com");
        //开启请求认证
        props.setProperty("mail.smtp.auth", "true");

        // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
        //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
        //     就需要开启 SSL 安全连接。
        /*
         			SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
                     需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
                         QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
         */

        //设置安全认证需要提供一个socketfactory，这个类由java提供
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        //设置ssl安全认证的端口
        props.setProperty("mail.smtp.port", "465");
        //只处理ssl的链接，对于非ssl的链接不做处理
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        //设置socketfactory的端口，和ssl安全认证的端口一样就好了
        props.setProperty("mail.smtp.socketFactory.port", "465");

        // 用于连接邮件服务器的参数配置（发送邮件时才需要用到）
        Session session = Session.getInstance(props);        // 根据参数配置，创建会话对象（为了发送邮件准备的）
        MimeMessage message = new MimeMessage(session);     // 创建邮件对象

        /*
         * 也可以根据已有的eml邮件文件创建 MimeMessage 对象
         * MimeMessage message = new MimeMessage(session, new FileInputStream("MyEmail.eml"));
         */

        // 2. From: 发件人
        //    其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
        //    真正要发送时, 邮箱必须是真实有效的邮箱。
        message.setFrom(new InternetAddress("1332854729@qq.com", "USER_AA", "UTF-8"));

        // 3. To: 收件人
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("394407209@qq.com", "USER_CC", "UTF-8"));
        //    To: 增加收件人（可选）
        // message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8"));
        //    Cc: 抄送（可选）
        //message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
        //    Bcc: 密送（可选）
      //  message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));

        // 4. Subject: 邮件主题
        message.setSubject("TEST邮件主题", "UTF-8");

        // 5. Content: 邮件正文（可以使用html标签）
        message.setContent("TEST这是邮件正文。。。", "text/html;charset=UTF-8");

        // 6. 设置显示的发件时间
        message.setSentDate(new Date());

        // 7. 保存前面的设置
        message.saveChanges();

        // 8. 将该邮件保存到本地
        OutputStream out = new FileOutputStream("MyEmail.eml");
        message.writeTo(out);
        out.flush();
        out.close();
    }

}

